package estadistec.logica.tipos;

import estadistec.logica.tipos.TipoIntervalo;
import estadistec.excepciones.ExcepcionFormatoNumeros;

/**
 * Una clase que guarda la información de un intervalo. En ella se debe
 * guardar tanto el valor de los extremos, así como el tipo de intervalo:
 * abierto por ambos lados, cerrado por ambos lados, o semiabierto, lo
 * cual se especifica en la clase @c TipoIntervalo.
 *
 * Además debe cumplirse que el intervalo no sea vacío, aunque sí se 
 * permite un intervalo con un único elemento.
 *
 * Solamente se ha incluido un constructor y "getters". Podría definirse,
 * en caso de ser necesario, "setters", pero me parece por ahora que no
 * hace falta.
 */
public class Intervalo {

	private TipoIntervalo _tipo;
	private float _valorIzq;
	private float _valorDer;

	/** 
	 * Constructor. Verifica que el intervalo no esté vacío.
	 * 
	 * @param tipo Tipo del intervalo 
	 * @param valorIzq Valor izquierdo del intervalo
	 * @param valorDer Valor derecho del intervalo
	 *
	 * @throws ExcepcionFormatoNumeros En caso de que el intervalo esté vacío, es
	 * decir, si el intervalo es cerrado y el valor izquierdo es mayor al valor
	 * derecho, o en caso contrario, si el valor izquierdo es mayor o igual al
	 * valor derecho.
	 */
	public Intervalo (TipoIntervalo tipo, float valorIzq, float valorDer) 
		throws ExcepcionFormatoNumeros 
	{
		if (tipo == TipoIntervalo.CERRADO) {
			if (valorIzq > valorDer)
				throw new ExcepcionFormatoNumeros("El intervalo está vacío");
		} else if (valorIzq >= valorDer)
			throw new ExcepcionFormatoNumeros("El intervalo está vacío");
		this._tipo = tipo;
		this._valorIzq = valorIzq;
		this._valorDer = valorDer;
	}

	public Intervalo (Intervalo intervalo) {
		this._tipo = intervalo.getTipo();
		this._valorIzq = intervalo.getValorIzq();
		this._valorDer = intervalo.getValorDer();
	}

	/** 
	 * Devuelve el tipo del intervalo.
	 */
	public TipoIntervalo getTipo() { return _tipo; }

	/** 
	 * Devuelve el valor izquierdo del intervalo.
	 */
	public float getValorIzq() { return _valorIzq; }

	/** 
	 * Devuelve el valor derecho del intervalo.
	 */
	public float getValorDer() { return _valorDer; }

}
